# -*- coding: utf-8 -*-


import os
os.environ['PATH'] ="C:/Oracle/Client/bin" + os.pathsep +os.environ['PATH'] 
import cx_Oracle

class CommunicationBaseDonnees(object):
    def __init__(self):
        self.Erreur = ""
        self.Curseur = None
        self.Connection = None
        self.Dictionnaire = DictionnaireSQL()
        
    def DemarrerConnection(self, NomConnection,MotDePasse,NomBaseDonnee):
        try:
            print NomConnection+'/'+MotDePasse+'@'+NomBaseDonnee
            self.Connection = cx_Oracle.connect(NomConnection+'/'+MotDePasse+'@'+NomBaseDonnee)
            self.Curseur = self.Connection.cursor()
            return [1, "Connection a la base de donnees reussit"]
        except cx_Oracle.DatabaseError, erreur:
            erreurNo=erreur.args[0].code
            if self.Dictionnaire.erreurDBMsg.has_key(erreurNo):
                return [0,self.Dictionnaire.erreurDBMsg[erreurNo]]
            else:
                return [0,self.Dictionnaire.erreurDBMsg[0]]
            
    def Authentification(self,nom,pwd):
        requete="SELECT COUNT(*) FROM perp_utilisateurs WHERE UPPER(IDENTIFIANT)='"+\
                     nom.upper()+"' AND MOT_DE_PASSE='" +pwd+"'" 
        self.Curseur.execute(requete)
        rows=self.Curseur.fetchall()
        if (rows[0][0]>0):
            return[1,"Athentification résussite"]
        else:
            return[0,"Veuillez vérifier le nom d'utilisateur ou le mot de passe"]
        pass
    
    def ArreterConnection(self):
        self.Curseur.close()
        self.Connection.close()
        
    def ExecuterRequeteSQL(self, RequeteSQL):
        print "Execution de ", RequeteSQL
        try:
           self.Curseur.execute(RequeteSQL)
           return [1, "Reussit"]
        except cx_Oracle.DatabaseError, erreur:
            erreurNo=erreur.args[0].code
            if self.Dictionnaire.erreurSqlMsg.has_key(erreurNo):
                self.Erreur = self.Dictionnaire.erreurSqlMsg[erreurNo]
            else: 
                self.Erreur = self.Dictionnaire.erreurDBMsg[0]
            return [0, self.Erreur]
    
    def ExecuterRequeteSQLWhere(self, RequeteSQL):
        print "Execution de ", RequeteSQL
        try:
           self.Curseur.execute(RequeteSQL)
           return [1, self.Curseur.fetchall()]
        except cx_Oracle.DatabaseError, erreur:
            erreurNo=erreur.args[0].code
            if self.Dictionnaire.erreurSqlMsg.has_key(erreurNo):
                self.Erreur = self.Dictionnaire.erreurSqlMsg[erreurNo]
            else: 
                self.Erreur = self.Dictionnaire.erreurDBMsg[0]
            return [0, self.Erreur]
    def RecevoirVue(self,NomVue):       
        f=open('Vues/'+NomVue+'.py','r')         
        p=f.readlines()         
        f.close()         
        return p         
        pass 
        
class DictionnaireSQL(object):
    
       erreurSqlMsg={
           0:'Oups!..Erreur indéterminée',
           # "select * from pme"
           942:'Table ou vue inexistante',
           #"select 2 / 0 from dual"
           1476:'le diviseur est égal à zéro',
           # "select N from emp"
           904:'identificateur non valide',
           # "slect Nome from emp"
           # "--rem"
           900:'instruction SQL non valide', 
           #"select nome rom emp"
           923:'mot-clé FROM abscent à l\'emplacement prévu',
           # "select Nom from emp where" 
           936:'expression absente',
           # "select Nome from emp where nome='roy' orde"
           933:'la commande SQL ne se termine pas correctement',
           #"select Nome from emp where nome='e' order"
           924:'mot-clé BY absent',
           # "select Nome from emp where nome='e' by nome having"
           921:'fin inattendue d\'une commande SQL',
           # "Alter emp"
           940: 'commande ALTER non valide',
           # "create table"
           901: 'commande CREATE non valide',
           #"insert"
           925: 'mot-clé INTO absent',
           # "update emp
           971: 'mot-clé SET absent',
           #"alter table emp delete"
           1735: 'option ALTER TABLE non valide',
           # ""
           24373: 'longueur indiquée non valide pour l\'instruction',
           # "set"
           922: 'option erronée ou absente',
           955: 'cette table existe deja'}

           # Erreur de la base de données elle même
       erreurDBMsg={#con=cx_Oracle.Connection('dalek/*@titan')
                         0:'Oups!..Erreur indéterminée',
                         1005:'aucun mot de passe indiqué',
                         1017:'Nom d\'utilisateur ou mot de passe invalid',
                         28000:'Le compte est verouillé',
                         28009:'La connection en tant que SYS devrait être SYSDBA ou SYSOPER',
                         12154: 'TNS : l\'identificateur de connexion indiqué n\'a pas pu être résolu'}
